package ru.compft.common.utils;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.security.authentication.encoding.MessageDigestPasswordEncoder;
import org.springframework.security.authentication.encoding.ShaPasswordEncoder;

/**
 * Created with IntelliJ IDEA.
 * User: VVasiliev
 * Date: 30.10.12
 * Time: 16:52
 * Утилиты для криптографии
 */
public class CryptoUtils {
    private static final Logger logger = LoggerFactory.getLogger(CryptoUtils.class);

    /**
     * Кодируем строку с помощью алгоритма SHA
     *
     * @param value
     * @param salt
     * @return
     */
    public static String encodePasswordSha(String value, String salt) {
        // по умолчанию используем SHA-1
        return encodePasswordSha(value, salt, 1);
    }

    /**
     * Кодируем строку с помощью алгоритма SHA-
     *
     * @param value
     * @param salt
     * @param strength EX: 1, 256, 384, 512
     * @return
     */
    public static String encodePasswordSha(String value, String salt, int strength) {
        if (logger.isDebugEnabled()) {
            logger.debug("Try encode string {" + value + "} with salt {" + salt + "} by algorithm SHA-" + strength);
        }

        // если параметр меньше или равен 0 - выставим его в 1 и запишет предупреждение
        if (strength <= 0) {
            strength = 1;
            if (logger.isWarnEnabled()) {
                logger.warn("Strength for algorithm SHA is set to 1");
            }
        }

        // в конструктор передаем параметр для SHA-
        final ShaPasswordEncoder encoder = new ShaPasswordEncoder(strength);
        return encoder.encodePassword(value, salt);
    }

    /**
     * Кодируем строку с помощью кодировщика переданного в параметре
     *
     * @param value
     * @param salt
     * @return
     */
    public static String encodePasswordWithMDEncoder(MessageDigestPasswordEncoder encoder, String value, String salt) {
        return encoder.encodePassword(value, salt);
    }

    public static void main(String[] args) {
        final String admin01 = encodePasswordSha("admin01", null, 256);
        final String oldvasya = encodePasswordSha("oldvasya", null, 256);
        System.out.println("admin01 = " + admin01);
        System.out.println("oldvasya = " + oldvasya);
    }
}
